/*
 * I2C.c
 *
 * Created: 2012-10-04 18:55:56
 *  Author: ur
 */ 

#include "I2C.h"
#include "time.h"
#include <avr/io.h>
// uint8_t stan_i2c ;
	 // 
	 // //funkcja wysylajaca i sprawdzajaca stan lini i2c
	 // 
	 //  uint8_t I2C_wyslij_dane(I2C_data i2c_bufor)
	 //  {
	 // 	 
	 // 	 return stan_i2c;
	 //  }
	 // 	 ;
	 
	 
	 // procedura transmisji sygna?u START
	 
	 
	 void twistart(void)
	 {
		 TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
		 while (!(TWCR & (1<<TWINT)));
		 //TWCR &= ~(1<<TWSTA);
		 //time.sekundy=0;
	 }

	 // procedura transmisji sygna?u STOP
	 void twistop(void)
	 {
		 TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
		 while ((TWCR & (1<<TWSTO)));
	 }

	 // procedura transmisji bajtu danych
	 void twiwrite(char data)
	 {
		 TWDR = data;
		 TWCR = (1<<TWINT) | (1<<TWEN);
		 while (!(TWCR & (1<<TWINT)));
	 }

	 //procedura odczytu bajtu danych
	 char twiread(char ack)
	 {
		 TWCR = ack
		 ? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
		 : ((1 << TWINT) | (1 << TWEN)) ;
		 while (!(TWCR & (1<<TWINT)));
		 return TWDR;
	 }

	 void get_time (void)
	 {       uint8_t tmp;
		 twistart();
		 twiwrite(0xA2);
		 twiwrite(0x02);
		 twistart();
		 twiwrite(0xA3);
		 tmp=twiread(ACK)& 0b01111111;
		 wsk_aktuanlny_czas()->sekundy= (tmp>>4)*10 +(tmp& 0x0f);
		 tmp=twiread(ACK)& 0b01111111;
		 wsk_aktuanlny_czas()->minuty= (tmp>>4)*10 +(tmp& 0x0f);
		 tmp=twiread(ACK)& 0b00111111;
		wsk_aktuanlny_czas()->godziny = (tmp>>4)*10 +(tmp& 0x0f);
		 twiread(ACK);
		 tmp=twiread(NOACK)&0b00000111;
		 wsk_aktuanlny_czas()->dni= tmp&0x07;
		 twistop();
	 };

	 void save_time (void)
	 {       twistart();
		 twiwrite(0xA2);
		 twiwrite(0x00);
		 twiwrite(0x0);
		 twiwrite(0);
		 twiwrite(0);
		 twiwrite((wsk_aktuanlny_czas()->minuty/10)<<4 | wsk_aktuanlny_czas()->minuty%10);
		 twiwrite((wsk_aktuanlny_czas()->godziny/10)<<4 | wsk_aktuanlny_czas()->godziny%10);
		 twiwrite(0);
		 twiwrite(wsk_aktuanlny_czas()->dni);
		 twistart();
		 twiwrite(0xA2);
		 twiwrite(0x0D);
		 twiwrite(0x83);
		 //twistart();
		 //twiwrite(0xA2);
		 //twiwrite(0x01);
		 //twiwrite(0x00);
		 
		 twistop();

	 }



	 void pcf_init (void)
	 {       // ustawienia predkosci oraz konfiguracja pcf 1Hz
		 TWBR=16; // ustawieni predkosci
		 

		 twistart();
		 twiwrite(0xA2);
		 twiwrite(0x0D);
		 twiwrite(0x83);         //aktywacja CLOCK OUT 1HZ
		 twistart();
		 twiwrite(0xA2);
		 twiwrite(0x0);
		 twiwrite(0x0);  //start zegara
		 
		 twistop();
		 
		 
		 


	 }




